home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
datelib.exe
/
WREADDAT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
10KB
|
292 lines
static char wreaddate_prg1[] =
"@(#)char *wreaddatew(WINDOW *win,int f, char *dstr) - Datum einlesen (Curses-win)";
static char wreaddate_prg2[] =
"@(#)char *readdatew(int f, char *dstr) - Datum einlesen (Curses-stdscr)";
static char wreaddate_ver[] = "@(#)v1.00/kr ; 01.08.91";
/* [w]readdatew Einlesen eines Datum-String - Curses-Version
**
** Autor Klaus Rath
**
** Deklaration char *wreaddatew(WINDOW *win,int format, char *datestring);
**
** Compilation DOS: bcc -c wreaddate.c c:\usr\local\lib\libkrc_s.lib
** UNIX: cc -c wreaddate.c /u1/usr/lib/libkrc.a
** ( unter DOS kann die Funktion im small-Modell laufen )
**
** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
** chem Format eingelesen werden soll.
** Z.Zt. erlaubte Formate (siehe datum.h) :
** tt.mm.[jj]jj -- Deutsches Format (format: 1,2)
** mm/tt/[jj]jj -- Amerikanisches Format (format: 3,4)
** [jj]jjmmtt -- Datenbankformat DDB/4 (format: 5,6)
** tt.mm. | mm/tt -- Kurzformat deutsch/am. (format: 7,8).
** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
** des Ergebnisses erwartet.
**
** Rückgabe (char *) auf datestring
**
** Anmerkungen Die Funktion prüft nicht die Validität des eingegebenen
** Datums - dies sollte die aufrufende Funktion selbst tun,
** bzw. den Test durch checkdate() durchführen lassen.
** Die Funktion benutzt zum Einlesen wgetch(win).
** wreaddate() stellt dem Aufrufer eine Maske des angeforder-
** ten Format zur Verfügung ( z.B. __.__.__ ), wobei die
** Unterstriche durch Zahlen gefüllt werden müssen. Die
** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
** nicht editierbar und werden automatisch erzeugt. Eine
** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
** immer, hinter der letzten Position genügt ein beliebige
** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
**
** Änderungen 1.00 ; 01.08.91
** - Erste Version für CURSES, basiert auf Version 1.10 von
** readdate().
** 1.01 ; 12.12.91
** - Einlesefehler beseitigt: obwohl für ein WINDOW *win
** konzipiert, wurde in wreaddate() mit getch() gelesen.
*/
#include <curses.h>
#include <string.h>
#ifdef __TURBOC__
#define ANSI
#define KR_SYS
#include <stdlib.h>
#include "datum.h"
#include "util.h"
#else
#include "/u1/usr/include/datum.h"
#include "/u1/usr/include/util.h"
#endif
/* Normalversion :
*/
#ifdef ANSI
char *wreaddatew(WINDOW *win,int format, char *dstring)
#else
char *wreaddatew(win,format,dstring)
WINDOW *win;
int format;
char *dstring;
#endif
{
/* Variablendefinitionen :
*/
int trennpos1 = 2, /* Positionen von Trennzeichen */
trennpos2 = 5;
int trenner; /* das Trennzeichen */
int pos = 0; /* Aktuelle Position */
int maxpos = 11; /* Letztmögliche Position */
int Max = 0; /* Schalter, ob am Ende */
int ch; /* Einzulesendes Zeichen */
int def_char = '_'; /* Default-Character */
/* Evtl. 1. Zeichen berücksichtigen :
*/
if ( dstring[0] == NULL ) {
dstring[0] = def_char;
}
else {
pos = 1;
}
/* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
*/
switch ( format ) {
case DE_KURZ :
trenner = '.';
maxpos = 9;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
wprintw(win,"%c_.__.__",dstring[0]);
wprintw(win,"\b\b\b\b\b\b\b");
break;
case DE_LANG :
trenner = '.';
maxpos = 11;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
wprintw(win,"%c_.__.____",dstring[0]);
wprintw(win,"\b\b\b\b\b\b\b\b\b");
break;
case AM_KURZ :
trenner = '/';
maxpos = 9;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
wprintw(win,"%c_/__/__",dstring[0]);
wprintw(win,"\b\b\b\b\b\b\b");
break;
case AM_LANG :
trenner = '/';
maxpos = 11;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
wprintw(win,"%c_/__/____",dstring[0]);
wprintw(win,"\b\b\b\b\b\b\b\b\b\b");
break;
case DB_KURZ :
maxpos = 7;
trennpos1 =
trennpos2 = 99;
wprintw(win,"%c_____",dstring[0]);
wprintw(win,"\b\b\b\b\b");
break;
case DB_LANG :
maxpos = 9;
trennpos1 =
trennpos2 = 99;
wprintw(win,"%c_______",dstring[0]);
wprintw(win,"\b\b\b\b\b\b\b");
break;
case DE_AKTJAHR :
trenner = '.';
maxpos = 7;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
wprintw(win,"%c_.__.",dstring[0]);
wprintw(win,"\b\b\b\b\b");
break;
case AM_AKTJAHR :
trenner = '/';
maxpos = 6;
dstring[trennpos1] = trenner;
trennpos2 = 99;
wprintw(win,"%c_/__",dstring[0]);
wprintw(win,"\b\b\b\b");
break;
default:
trenner = '.';
maxpos = 9;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
} /* ENDE: switch(format) */
/* Evtl. noch ein Rückschritt :
*/
if ( !pos ) {
wprintw(win,"\b");
}
wrefresh(win);
/* Tastendrucke abholen, bis maxpos :
*/
while ( pos < maxpos + 1 ) {
if ( pos == 0 ) {
dstring[pos] = def_char;
}
wrefresh(win);
/* Falls fertig, String zurückgeben :
*/
if ( pos == maxpos ) {
dstring[pos] = '\0';
return(dstring);
}
/* An eventuellen Trennerpositionen den passenden Trenner einfügen
** und den nächsten Schleifendurchlauf abwarten :
*/
if ( pos == trennpos1 || pos == trennpos2 ) {
wprintw(win,"%c",trenner);
wrefresh(win);
pos++;
continue;
}
/* An der vorletzten Position sind alle Tasten erlaubt, denn nur
** BACKSPACE bleibt in der Funktion :
*/
if ( pos == maxpos - 1 ) {
Max = 1;
}
ch = wgetch(win);
/* Auswertung der gedrückten Taste :
*/
switch ( ch ) {
/* Nicht Zulässiges ignorieren :
*/
case NULL:
case -1 :
break;
/* Abbruchmöglichkeiten :
*/
case 27 :
dstring[0] = '\0';
return(dstring);
case 10 :
case 13 :
dstring[pos] = '\0';
return(dstring);
/* Korrekturmöglichkeit :
*/
case 8 :
dstring[pos] = def_char;
if ( pos == 0 ) {
break;
}
/*